<?php

class TutoriaController extends Zend_Controller_Action {

    public function init() {
        X\Permiso::paraController();
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {

        X\Permiso::paraAction('Crear.Tutoria');
        $session = new Zend_Session_Namespace('Usuario');

        $facultades = $this->em->createQueryBuilder()
                        ->select('f.idFacultad')
                        ->addselect('f.nombre')
                        ->from('Default_Model_Facultad', 'f')
                        ->orderBy('f.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->facultades = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($facultades),
                    "rows" => $facultades
                ));

        if ($session->permisos_generales['Crear.Tutoria']['value'] == 'all') {
            $carreras = $this->em->createQueryBuilder()
                            ->select('c.idCarrera')
                            ->addselect('c.nombre')
                            ->addselect('c.duracionHora')
                            ->from('Default_Model_Carrera', 'c')
                            ->orderBy('c.nombre', 'asc')
                            ->getQuery()
                            ->execute();
        } else if ($session->permisos_generales['Crear.Tutoria']['value'] == 'normal') {

            $array = '(';
            $c = 0;
            // X\Msg::Success('El horario ha2');return;
            foreach ($session->permisos_generales['Crear.Tutoria']['departamento'] as $p) {
                if ($c) {
                    $array.=',' . $p;
                    $c++;
                } else {
                    $c++;
                    $array.=$p;
                }
            }
            $array.=')';

            $carreras = $this->em->createQueryBuilder()
                            ->select('c.idCarrera')
                            ->addselect('c.nombre')
                            ->addselect('c.duracionHora')
                            ->from('Default_Model_Carrera', 'c')
                            ->where('c.departamento IN' . $array . '')
                            ->orderBy('c.nombre', 'asc')
                            ->getQuery()
                            ->execute();
        }

        $this->view->carreras = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($carreras),
                    "rows" => $carreras
                ));

        $aulas = $this->em->createQueryBuilder()
                        ->select('a.idAula')
                        ->addselect('a.nombre')
                        ->from('Default_Model_Aula', 'a')
                        ->orderBy('a.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->aulas = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($aulas),
                    "rows" => $aulas
                ));
        $qb = $this->em->createQueryBuilder();
        $profesores = $qb->select('p.idProfesor')
                        ->addselect('u.nombre')
                        ->addselect('u.apellido')
                        ->from('Default_Model_Profesor', 'p')
                        ->join('p.usuario', 'u')
                        ->orderBy('u.apellido', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->profesores = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($profesores),
                    "rows" => $profesores
                ));
        $categorias = $this->em->createQueryBuilder()
                        ->select('c.idCategoria')
                        ->addselect('c.nombre')
                        ->from('Default_Model_Categoria', 'c')
                        ->orderBy('c.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->categorias = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($categorias),
                    "rows" => $categorias
                ));
    }

    public function ajaxMateriasAction() {

        // Para traer las materias posibles segun la carrera y semestre
        // y verificar que no exista un horario en el mismo periodo

        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');
	
        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(c.idCurso)')
                        ->from('Default_Model_Curso', 'c')
                        ->join('c.carreraMateria', 'cm')
                        ->join('cm.carrera', 'ca')
                        ->where("c.anho='" . $anho . "'")
                        ->andWhere($where_semestre)
                        ->andWhere("c.semestreAnho='" . $semanho . "'")
                        ->andWhere("c.seccion='" . $seccion . "'")
                        ->andWhere("ca.idCarrera='" . $carrera . "'")
                        ->andWhere("c.tipo='T'")
                        ->getQuery()
                        ->getSingleScalarResult();

        if ($cantidad > 0) {
            X\Msg::Failure('Ya existe un horario de tutorías en este periodo académico. Búsquelo en el módulo de edición.');
            return;
        } else {


            $materias = $this->em->createQueryBuilder()
                            ->select('cm.idCarreraMateria')
                            ->addSelect('m.nombre')
                            ->addSelect('m.horasCatedra')
                            ->from('Default_Model_CarreraMateria', 'cm')
                            ->join('cm.materia', 'm')
                            ->where($where_semestre)
                            ->andWhere($where_tipo)
                            ->andWhere("cm.carrera='" . $carrera . "'")
                            ->orderBy('m.nombre', 'asc')
                            ->getQuery()
                            ->execute();


            if (count($materias) == 0) {
                X\Msg::Failure('No existen materias para el semestre seleccionado.<br>Por favor seleccione un semestre diferente.');
            } else {
                echo Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($materias),
                    "rows" => $materias
                ));
            }
        }
    }

    public function ajaxCargarAction() {

        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');
        $detalles = $this->_request->getPost('detalles');
        $responsables = $this->_request->getPost('responsables');
        $detalleR = $this->_request->getPost('detalleR');
        $detalles = Zend_Json::decode($detalles);
        $detalleR = Zend_Json::decode($detalleR);
        $responsables = Zend_Json::decode($responsables);
        if($semestre=='libre'){
            $semestre=0;
        }
        //X\Msg::Success(' '.count($detalles).' '.count($detalleR).' '.count($responsables));return;
        //Determinar fecha de validez del curso segun semestre del año
        if ($semanho == 1) {
            $desde = '01/01/' . $anho;
            $hasta = '30/06/' . $anho;
        } else {
            $desde = '01/07/' . $anho;
            $hasta = '31/12/' . $anho;
        }

        function compare_materia($a, $b) {
            return strnatcmp($a['materia'], $b['materia']);
        }
		

        // sort by materia
        usort($detalles, 'compare_materia');
        usort($responsables, 'compare_materia');

        //id de carrera materia, inicialmente 0 (ninguna)
        $cm = -1;
	
        foreach ($detalles as $detalle) {
            //Nueva materia, implica nuevo curso
            if ($cm != $detalle['materia']) {
                //La primera vez no hay materia todavia

                if ($cm != -1) {
                    $this->em->persist($curso);
                }
                $carreraMateria = $this->em->find('Default_Model_CarreraMateria', $detalle['materia']);
		  
                $cm = $detalle['materia'];
                //crear curso
                $curso = new Default_Model_Curso();
                $curso->setCarreraMateria($carreraMateria);
                $curso->setAnho($anho);
                $curso->setSemestre($semestre);
                $curso->setSemestreAnho($semanho);
                $curso->setSeccion($seccion);
                $curso->setValidoDesde($desde);
                $curso->setValidoHasta($hasta);
                $curso->setTipo('T');
            }

            //Definir condicion de busqueda para aula
            if ($detalle['aula'])
                $whereAula = "d.aula='" . $detalle['aula'] . "'";
            else
                $whereAula = "d.aula IS NULL";

            //Verificar que no exista el detalle
            $qb = $this->em->createQueryBuilder();
            $check = $qb->select('d.idDetalle')
                            ->from('Default_Model_DetalleCurso', 'd')
                            ->where("d.dia='" . $detalle['dia'] . "'")
                            ->andWhere("d.horaInicio='" . $detalle['inicio'] . "'")
                            ->andWhere("d.horaFin='" . $detalle['fin'] . "'")
                            ->andWhere("d.duracionHoras='" . $detalle['horas'] . "'")
                            ->andWhere($whereAula)
                            ->getQuery()
                            ->execute();

            if ($check) {
                $detalleCurso = $this->em->find('Default_Model_DetalleCurso', $check[0]['idDetalle']);
                $curso->getDetalles()->add($detalleCurso);
            } else {
                //Datos de detalle
                $detalleCurso = new Default_Model_DetalleCurso();
                if ($detalle['aula']) {
                    $aula = $this->em->find('Default_Model_Aula', $detalle['aula']);
                    $detalleCurso->setAula($aula);
                }
                $detalleCurso->setDia($detalle['dia']);
                $detalleCurso->setHoraInicio($detalle['inicio']);
                $detalleCurso->setHoraFin($detalle['fin']);
                $detalleCurso->setDuracionHoras($detalle['horas']);
                $this->em->persist($detalleCurso);
                $curso->getDetalles()->add($detalleCurso);
            }
        }
        $this->em->persist($curso);
        $this->em->flush();

        // $responsables = Zend_Json::decode($responsables);
	

        foreach ($responsables as $resp) {

            //Verificar que no exista el par (curso, profesor) antes de cargar
            //Esto tanto en la BD como en los datos traidos de la pagina
            //Tal vez haga falta un for de verificacion antes de este for de carga
		//X\Msg::Failure('El horario ha sido cargado exitosamente. JOJOJOJOJO1'/*.$cursos->getCurso()*/);return;
            $cursos = $this->em->createQueryBuilder()
                             ->select    ('c.idCurso')
                             ->from      ('Default_Model_Curso', 'c')
                             ->join      ('c.carreraMateria','cm')
                             ->join      ('cm.materia','m')
				 ->where     ("cm.idCarreraMateria='".$resp['materia']."'")
                             ->andWhere  ("c.semestre='".$semestre."'")
                             ->andWhere  ("c.semestreAnho='".$semanho."'")
                             ->andWhere  ("c.seccion='".$seccion."'")
                             ->andWhere  ("c.anho='".$anho."'")
                             ->andWhere  ("cm.carrera='".$carrera."'")
                             ->andWhere("c.tipo='T'")
                             ->getQuery  ()
                             ->execute();
    
		//X\Msg::Failure('El horario ha sido cargado exitosamente. JO '.$cursos[0]['idCurso']);return;

	        $curso =  $this->em->find('Default_Model_Curso', $cursos[0]['idCurso']);
            $categoria = $this->em->find('Default_Model_Categoria', $resp['categoria']);
            $profesor = $this->em->find('Default_Model_Profesor', $resp['profesor']);
	     
            if ($resp['marca'] == 1) {
                $marca = true;
            } else {
                $marca = false;
            }

            $profesorExistente = $this->em->createQueryBuilder()
                            ->select('c.idResponsable')
                            ->from('Default_Model_Responsable', 'c')
                            ->join('c.categoria', 't')
                            ->join('c.profesor', 'p')
                            ->where("c.marca='" . $marca . "'")
                            ->andWhere("t.idCategoria='" . $resp['categoria'] . "'")
                            ->andWhere("p.idProfesor='" . $resp['profesor'] . "'")
                            ->getQuery()
                            ->execute();
		
            if (count($profesorExistente) > 0) {
                $responsable = $this->em->find('Default_Model_Responsable', $profesorExistente[0]['idResponsable']);
		  // X\Msg::Failure('El horario ha sido cargado exitosamente. JOJOJOJOJO1');return;
                $curso->getResponsables()->add($responsable);
                $this->em->persist($curso);
                $c=0;
            } else {
                $c=1;
                $responsable = new Default_Model_Responsable();

                $responsable->setCategoria($categoria);
                $responsable->setProfesor($profesor);
                $responsable->setMarca($marca);
                $this->em->persist($responsable);
	         
                $curso->getResponsables()->add($responsable);
			
                $this->em->persist($curso);
		 
            }
        }
        $this->em->flush();

        X\Msg::Success('El horario ha sido cargado exitosamente.');
    }

}

